package com.filters;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;

import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.internal.http.HttpMethod;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.StreamUtils;

import com.common.models.RetCode;
import com.common.models.RetResult;
import com.common.util.redis.RedisUtils;
import com.google.gson.Gson;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

@Component
public class CustomerTokenFilter extends ZuulFilter {

	private static Logger log = LoggerFactory
			.getLogger(CustomerTokenFilter.class);

	@Autowired
	private ProxyRequestHelper helper;

	@Autowired
	private RedisUtils redisUtils;

	// 需要进行token验证的url
	private static List<String> filterUrlList = new ArrayList<String>(
			Arrays.asList("forMy"));

	@Override
	public String filterType() {
		// return "pre";
		return FilterConstants.PRE_TYPE;
	}

	@Override
	public int filterOrder() {
	    return FilterConstants.SEND_FORWARD_FILTER_ORDER;
	}

	@Override
	public boolean shouldFilter() {

		// //检查用户请求的url是否需要token校验
		// String requestUrl =
		// RequestContext.getCurrentContext().getRequest().getRequestURL().toString();
		// for(String url : filterUrlList )
		// {
		// if(requestUrl.indexOf(url) > -1)
		// {
		// return true;
		// }
		// }

		// return false;
		return true;
	}

	@Override
	public Object run() {

		RetResult ret = new RetResult();
		ret.setCode(RetCode.SUCCESS);

		RequestContext ctx = RequestContext.getCurrentContext();
		HttpServletRequest request = ctx.getRequest();
		log.info(String.format("%s >>> %s", request.getMethod(), request
				.getRequestURL().toString()));
		String token = request.getParameter("token");
		String requestURL = request.getRequestURL().toString();
		String apiName = request.getParameter("apiName");
		String data = request.getParameter("data");
		
		String newUrl = requestURL + apiName;
//		try {
//			ctx.setRouteHost(new URL(newUrl));
//		} catch (MalformedURLException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		//ctx.set("requestURI", newUrl);

		// String method = request.getMethod();
		// String uri = this.helper.buildZuulRequestURI(request);
		// Headers.Builder headers = new Headers.Builder();
		// Enumeration<String> headerNames = request.getHeaderNames();
		// while (headerNames.hasMoreElements()) {
		// String name = headerNames.nextElement();
		// Enumeration<String> values = request.getHeaders(name);
		// while (values.hasMoreElements()) {
		// String value = values.nextElement();
		// headers.add(name, value);
		// }
		// }
		//
		// InputStream inputStream;
		// RequestBody requestBody = null;
		// OkHttpClient httpClient = new OkHttpClient.Builder()
		// // customize
		// .build();
		// try {
		// inputStream = request.getInputStream();
		// if (inputStream != null && HttpMethod.permitsRequestBody(method)) {
		// MediaType mediaType = null;
		// if (headers.get("Content-Type") != null) {
		// mediaType = MediaType.parse(headers.get("Content-Type"));
		// }
		// requestBody = RequestBody.create(mediaType,
		// StreamUtils.copyToByteArray(inputStream));
		// }
		// Request.Builder builder = new Request.Builder()
		// .headers(headers.build()).url(requestURL)
		// .method(method, requestBody);
		//
		// Response response = httpClient.newCall(builder.build()).execute();
		// LinkedMultiValueMap<String, String> responseHeaders = new
		// LinkedMultiValueMap<>();
		// for (Map.Entry<String, List<String>> entry : response.headers()
		// .toMultimap().entrySet()) {
		// responseHeaders.put(entry.getKey(), entry.getValue());
		// }
		// this.helper.setResponse(response.code(), response.body()
		// .byteStream(), responseHeaders);
		// ctx.setRouteHost(null); // prevent SimpleHostRoutingFilter from
		// // running
		//
		// } catch (IOException e) {
		// // TODO Auto-generated catch block
		// e.printStackTrace();
		// }

		// Object originalRequestPath =
		// ctx.get(FilterConstants.REQUEST_URI_KEY);
		// //http://localhost:10000/demo/list/data
		// //-->/api/prefix/list/data
		// String originalRequestPathStr = originalRequestPath == null ? "" :
		// (String)originalRequestPath;
		// String modifiedRequestPath = apiName + originalRequestPathStr;
		// ctx.put(FilterConstants.REQUEST_URI_KEY, modifiedRequestPath);

//		BufferedReader br;
//		String requestBody;
//		try {
//
//			StringBuffer sb = new StringBuffer("");
//			String temp;
//
//			br = new BufferedReader(new InputStreamReader(
//					(ServletInputStream) request.getInputStream(), "utf-8"));
//			while ((temp = br.readLine()) != null) {
//				sb.append(temp);
//			}
//
//			br.close();
//			requestBody = sb.toString();
//			request.setAttribute("data", requestBody);
//		} catch (IOException e2) {
//			// TODO Auto-generated catch block
//			e2.printStackTrace();
//		}

		// if(token == null || token.equals("")) {
		// ret.setCode(RetCode.PARAM_ERR);
		// ret.setMsg(RetCode.PARAM_ERR_MSG);
		// }

		// 从redis缓存中根据token获取顾客个人信息。如果有，则token验证成功，否则失败
		// Object customer = redisUtils.get("token" + token);
		// if( null == customer )
		// {
		// ret.setCode(RetCode.TOKEN_ERROR);
		// ret.setMsg(RetCode.TOKEN_ERROR_MSG);
		// }
		//
		// if(ret.getCode() != RetCode.SUCCESS)
		// {
		// Gson gson = new Gson();
		// String jsonStr = gson.toJson(ret);
		// ctx.setSendZuulResponse(false);
		// ctx.setResponseStatusCode(200);
		//
		// try {
		// ctx.getResponse().getWriter().write(jsonStr);
		// }catch (Exception e){
		// e.printStackTrace();
		// }
		//
		// return null;
		// }

		log.info("ok");
		return null;
	}
}